<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Agp\CoreBundle\Entity\VendaAgape;

/**
 * Agp\CoreBundle\Entity\CobrancaContrato
 *
 * @ORM\Table(name="cobranca_contrato")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\CobrancaContratoRepository")
 * @ORM\HasLifecycleCallbacks
 */
class CobrancaContrato
{
    /**
     * @var integer $codCobrancaContrato
     *
     * @ORM\Column(name="cod_cobranca_contrato", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $codCobrancaContrato;

    /**
     * @var float $vlrParcela
     *
     * @ORM\Column(name="vlr_parcela", type="float")
     * @Assert\NotBlank(groups={"add"})
     */
    protected $vlrParcela;
    
    /**
     * @var float $acrecimo
     *
     * @ORM\Column(name="acrecimo", type="float", nullable=true)
     */
    protected $acrecimo;
    
    /**
     * @var float $decrecimo
     *
     * @ORM\Column(name="decrecimo", type="float", nullable=true)
     */
    protected $decrecimo;
    
    /**
     * @var float $vlrPago
     *
     * @ORM\Column(name="vlr_pago", type="float", nullable=true)
     * @Assert\NotBlank(groups={"baixa"})
     */
    protected $vlrPago;
    
    /**
     * @var date $dtVencimento
     *
     * @ORM\Column(name="dt_vencimento", type="date")
     * @Assert\NotBlank
     */
    protected $dtVencimento;
    
    const COB_ABERTO = 'Aberto';
    const COB_BAIXADO = 'Baixado';
    const COB_VISUALIZADO = 'Visualizado';
    const COB_CANCELADO = 'Cancelado';
    /**
     * @var string $situacao
     *
     * @ORM\Column(name="situacao", type="string", length=45)
     */
    protected $situacao;
    
    /**
     * @ORM\ManyToOne(targetEntity="Contrato", cascade={"persist"}, fetch="LAZY", inversedBy="cobrancasContrato")
     * @ORM\JoinColumn(name="cod_contrato", referencedColumnName="cod_contrato", onDelete="restrict", nullable=false)
     * @var object
     */
    protected $contrato;
    
    /**
     * @var date $dtEntrada
     *
     * @ORM\Column(name="dt_entrada", type="date")
     * @Assert\NotBlank
     */
    protected $dtEntrada;
    
    /**
     * @var date $dtBaixado
     *
     * @ORM\Column(name="dt_baixado", type="datetime", nullable=true)
     */
    protected $dtBaixado;
    
    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\VendaAgape", mappedBy="cobrancas")
     * @ORM\JoinTable(name="venda_agape_cobranca_contrato",
     *     joinColumns={@ORM\JoinColumn(name="cod_cobranca_contrato", referencedColumnName="cod_cobranca_contrato", onDelete="restrict")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_venda_agape", referencedColumnName="cod_venda_agape", onDelete="restrict")}
     * )
     * @var ArrayCollection $cobrancas
     */ 
    protected $vendas;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\Boleto", cascade={"persist"})
     * @ORM\JoinColumn(name="cod_boleto", referencedColumnName="cod_boleto", onDelete="Cascade")
     * @var object
     */
    protected $boleto;
    
    const TP_COBRANCA = 'cobranca_regular';
    const TP_VENDA = 'venda';
    /**
     * @var string $tipo
     *
     * @ORM\Column(name="tipo", type="string", length=45)
     */
    protected $tipo;
    
    /**
     * @var date $dt_referencia
     *
     * @ORM\Column(name="dt_referencia", type="date")
     */
    protected $dtReferencia;
    
    /**
     * @var date $dt_pgto
     *
     * @ORM\Column(name="dt_pgto", type="date", nullable=true)
     * @Assert\NotBlank(groups={"baixa"})
     */
    protected $dtPgto;
    
    /**
     * @var string $observacao
     *
     * @ORM\Column(name="observacao", type="text", nullable=true)
     */
    protected $observacao;
    
    /**
     * @ORM\Column(name="demonstrativo01", type="string", nullable=true)
     * @var string
     */
    protected $demonstrativo01;
    
    /**
     * @ORM\Column(name="demonstrativo02", type="string", nullable=true)
     * @var string
     */
    protected $demonstrativo02;

    public function getValorMulta(){
        $percentual = $this->getBoleto()->getConfigBoleto()->getPercentualMulta()/100;
        return $this->getValorTotal()*$percentual;
        
    }
    
    public function getValorJurosDia(){
        $percentual = ($this->getBoleto()->getConfigBoleto()->getPercentualJuros()/30)/100;
        return $this->getValorTotal()*$percentual;
        
    }
    
    public function getParcela(){
        return $this->vlrParcela;
    }

    public function __toString() {
        return 'Contrato: '.$this->contrato->getCodContrato().' - Doc: '.$this->codCobrancaContrato. ' - Vencimento: '.$this->dtVencimento->format('d/m/Y'). ' - Situação: '.$this->situacao;
    }
    
    public function __construct() {
        $this->situacao = self::COB_ABERTO;
        $this->dtEntrada = new \DateTime;
        $this->vendas = new ArrayCollection;
        $this->vlrPago = 0;
        $this->acrecimo = 0;
        $this->decrecimo = 0;
    }
    
    public function getValorTotal()
    {
        $total = 0;
        foreach($this->getVendas() as $venda){
            if ($venda->getSituacao() != VendaAgape::SIT_CANCELADO){
                if ($this->getCodCobrancaContrato() == $venda->getCobrancas()->last()->getCodCobrancaContrato()){
                    $total += $venda->getValorTotalDiferenca();
                }else{
                    $total += $venda->getValorTotalCobrancaVenda();
                }
                
            }
            
        }

        return $total += ($this->getParcela() - $this->decrecimo + $this->acrecimo);
    }
    
    public function getValorTotalLessAbatimento()
    {
        $total = 0;
        foreach($this->getVendas() as $venda){
            if ($venda->getSituacao() != VendaAgape::SIT_CANCELADO){
                $total += $venda->getValorTotal();
            }
        }
        
        return $total += $this->getVlrParcela();
    }
    
    public function getDtReferenciaProtesto()
    {
        $dataSeguinteCalculo = clone $this->getDtVencimento();
        if ($this->tipo == self::TP_COBRANCA){
            $mesSeguinte = $dataSeguinteCalculo->modify('+1 month')->format('m');
            $ano = $dataSeguinteCalculo->modify('+1 month')->format('Y');
            return new \DateTime('15-'.$mesSeguinte.'-'.$ano);
        }else if ($this->tipo == self::TP_VENDA){
            return $dataSeguinteCalculo->modify('+30 days');
        }
    }

        /**
     * @ORM\PreUpdate
     * @ORM\PrePersist
     */
    public function atualizaDtBaixado(){
        
        if ($this->situacao === self::COB_BAIXADO){
            $this->setDtBaixado(new \DateTime);
        }else{
            $this->setDtBaixado(null);
        }
    
    }
    
    public function getQtdVendasNotCancelado(){
        $i = 0;
        foreach ($this->vendas as $venda){
            if ($venda->getSituacao() != VendaAgape::SIT_CANCELADO){
                $i += 1;
            }
        }
        
        return $i;
    }
    
    public function getTipoLabel(){
        if ($this->getTipo() == self::TP_COBRANCA){
            return 'Cobrança Regular';
        }else{
            return 'Venda';
        }
    }

    /**
     * Get codCobrancaContrato
     *
     * @return integer 
     */
    public function getCodCobrancaContrato()
    {
        return $this->codCobrancaContrato;
    }

    /**
     * Set vlrParcela
     *
     * @param float $vlrParcela
     * @return CobrancaContrato
     */
    public function setVlrParcela($vlrParcela)
    {
        $this->vlrParcela = substr(str_replace(",", ".", $vlrParcela),3);
    
        return $this;
    }
    
    public function setVlrParcelaFloat($vlrParcela)
    {
        $this->vlrParcela = $vlrParcela;
    
        return $this;
    }

    /**
     * Get vlrParcela
     *
     * @return float 
     */
    public function getVlrParcela()
    {
        return $this->vlrParcela;
    }
    
    public function getContrato() {
        return $this->contrato;
    }

    public function setContrato($contrato) {
        $this->contrato = $contrato;
    }
    
    /**
     * Set situacao
     *
     * @param string $situacao
     * @return Boleto
     */
    public function setSituacao($situacao)
    {
        $this->situacao = $situacao;
    
        return $this;
    }

    /**
     * Get situacao
     *
     * @return string 
     */
    public function getSituacao()
    {
        return $this->situacao;
    }
    
    public function getDtVencimento() {
        return $this->dtVencimento;
    }

    public function setDtVencimento($dtVencimento) {
        $this->dtVencimento = $dtVencimento;
    }
    
    public function getDtEntrada() {
        return $this->dtEntrada;
    }

    public function setDtEntrada($dtEntrada) {
        $this->dtEntrada = $dtEntrada;
    }
    
    public static function getSituacaoList()
    {
        return array(self::COB_ABERTO => self::COB_ABERTO,
                     self::COB_BAIXADO => self::COB_BAIXADO,
                     self::COB_VISUALIZADO => self::COB_VISUALIZADO,
                     self::COB_CANCELADO => self::COB_CANCELADO);
    }
    
    public function getVendas() {
        return $this->vendas;
    }

    public function setVendas($vendas) {
        $this->vendas = $vendas;
    }
    
    public function addVenda($venda) {
        $this->vendas[] = $venda;
    }
    
    public function getBoleto() {
        return $this->boleto;
    }

    public function setBoleto($boleto) {
        $this->boleto = $boleto;
    }
    
    public function getDtBaixado() {
        return $this->dtBaixado;
    }

    public function setDtBaixado($dtBaixado) {
        $this->dtBaixado = $dtBaixado;
    }
    
    public function getVlrPago() {
        return $this->vlrPago;
    }

    public function setVlrPago($vlrPago) {
        if (is_string($vlrPago)){
            $this->vlrPago = substr(str_replace(",", ".", $vlrPago),3);
        }else{
            $this->vlrPago = $vlrPago;
        }
    }
    
    public function setVlrPagoFromRetorno($vlrPago){
        $this->vlrPago = $vlrPago;
    }

    public function getTipo() {
        return $this->tipo;
    }

    public function setTipo($tipo) {
        $this->tipo = $tipo;
    }

    public function getDtReferencia() {
        return $this->dtReferencia;
    }

    public function setDtReferencia($dtReferencia) {
        $this->dtReferencia = $dtReferencia;
    }
    
    public function getDtPgto() {
        return $this->dtPgto;
    }

    public function setDtPgto($dtPgto) {
        $this->dtPgto = $dtPgto;
    }
    
    public function getObservacao() {
        return $this->observacao;
    }

    public function setObservacao($observacao) {
        $this->observacao = $observacao;
    }

    public function getAcrecimo() {
        return $this->acrecimo;
    }

    public function setAcrecimo($acrecimo) {
        $this->acrecimo = substr(str_replace(",", ".", $acrecimo),3);
    }

    public function getDecrecimo() {
        return $this->decrecimo;
    }

    public function setDecrecimo($decrecimo) {
        $this->decrecimo = substr(str_replace(",", ".", $decrecimo),3);
    }
    
    public function getDemonstrativo01() {
        return $this->demonstrativo01;
    }

    public function setDemonstrativo01($demonstrativo01) {
        $this->demonstrativo01 = $demonstrativo01;
    }

    public function getDemonstrativo02() {
        return $this->demonstrativo02;
    }

    public function setDemonstrativo02($demonstrativo02) {
        $this->demonstrativo02 = $demonstrativo02;
    }

}
